/**
 * 辉瑞停车场预约系统API
 * 注意：由于这是一个小程序前端项目，本文件只是模拟后端API的实现
 * 实际使用时应替换为真实的API调用
 */

// 引入工具函数
const util = require('./util')

// 模拟API调用延迟（毫秒）
const API_DELAY = 800

// 模拟有效用户数据（开发调试用）
const VALID_USERS = [
  { phone: '13900000001', name: '张三', license: '沪A12345' },
  { phone: '13900000002', name: '李四', license: '沪B67890' },
  { phone: '13900000003', name: '王五', license: '沪C54321' }
]

// 模拟API调用，添加随机失败率
const mockApiCall = (
  successData,
  failureMsg = '操作失败',
  failureRate = 0.1
) => {
  return new Promise((resolve, reject) => {
    // 开发环境不随机失败，在微信小程序中我们暂时默认为开发环境
    const isDev = true // 微信小程序中没有process.env，所以我们默认为开发环境
    const shouldFail = !isDev && Math.random() < failureRate

    setTimeout(() => {
      if (shouldFail) {
        console.log('API调用模拟失败:', failureMsg)
        reject({ success: false, message: failureMsg })
      } else {
        resolve(successData)
      }
    }, API_DELAY)
  })
}

/**
 * 登录验证
 * @param {string} phone 手机号
 * @returns {Promise} 登录结果
 */
const login = (phone) => {
  console.log('调用登录API:', { phone })

  // 检查基本格式
  if (!util.validatePhone(phone)) {
    return Promise.reject({ success: false, message: '手机号格式不正确' })
  }

  // 随机生成一个默认车牌号（仅用于测试）
  const defaultLicense = `沪${String.fromCharCode(
    65 + Math.floor(Math.random() * 26)
  )}${Math.floor(Math.random() * 100000)
    .toString()
    .padStart(5, '0')}`

  return mockApiCall(
    {
      success: true,
      userInfo: {
        phone,
        license: defaultLicense, // 使用随机生成的车牌号
        name: phone.startsWith('139')
          ? `测试用户_${phone.slice(-4)}`
          : '未知用户',
        remainingQuota: 80, // 初始剩余预约次数
        year: new Date().getFullYear()
      }
    },
    '登录失败，该手机号未在系统中注册',
    0.2
  )
}

/**
 * 获取停车场可用车位数量
 * @param {string} startDate 起始日期字符串，格式为YYYY-MM-DD
 * @returns {Promise} 未来40天的可用车位信息
 */
const getParkingAvailability = (startDate) => {
  console.log('调用获取车位API:', { startDate })

  if (!startDate || !/^\d{4}-\d{2}-\d{2}$/.test(startDate)) {
    return Promise.reject({ success: false, message: '日期格式不正确' })
  }

  // 生成未来40天的车位数据
  const totalDays = 40
  const totalSpots = 80
  const availabilityData = []

  const startDateObj = new Date(startDate)

  for (let i = 0; i < totalDays; i++) {
    const currentDate = new Date(startDateObj)
    currentDate.setDate(startDateObj.getDate() + i)

    // 格式化日期为YYYY-MM-DD
    const year = currentDate.getFullYear()
    const month = (currentDate.getMonth() + 1).toString().padStart(2, '0')
    const day = currentDate.getDate().toString().padStart(2, '0')
    const dateStr = `${year}-${month}-${day}`

    // 生成当天的车位数据
    const weekday = currentDate.getDay()
    // 周六和周日不可预约，数据为null
    let availableSpots = null

    // 对于工作日，随机生成可用车位数据
    if (weekday !== 0 && weekday !== 6) {
      // 假设某些日期数据可能异常(约5%的概率)
      const isAbnormal = Math.random() < 0.05

      if (!isAbnormal) {
        const reservedSpots = Math.floor(Math.random() * totalSpots * 0.8) // 最多80%被预约
        availableSpots = totalSpots - reservedSpots
      } else {
        // 数据异常情况，设置为null
        availableSpots = null
      }
    }

    availabilityData.push({
      date: dateStr,
      weekday: weekday,
      availableSpots: availableSpots
    })
  }

  return mockApiCall(
    {
      success: true,
      startDate,
      data: availabilityData
    },
    '获取车位信息失败',
    0.1
  )
}

/**
 * 提交预约请求
 * @param {Object} data 预约数据
 * @param {string} data.phone 手机号
 * @param {Array<string>} data.dates 预约日期列表
 * @returns {Promise} 预约结果
 */
const submitReservation = (data) => {
  console.log('调用提交预约API:', data)

  if (
    !data ||
    !data.phone ||
    !Array.isArray(data.dates) ||
    data.dates.length === 0
  ) {
    return Promise.reject({ success: false, message: '预约参数不完整' })
  }

  // 随机分配车位
  const spotId = Math.floor(Math.random() * 80) + 1

  return mockApiCall(
    {
      success: true,
      spotId,
      spotName: `P-${spotId}`,
      message: '预约成功'
    },
    '预约失败，请稍后再试',
    0.15
  )
}

/**
 * 获取用户预约记录
 * @param {string} phone 手机号
 * @returns {Promise} 预约记录
 */
const getUserReservations = (phone) => {
  console.log('调用获取预约记录API:', { phone })

  if (!phone || !util.validatePhone(phone)) {
    return Promise.reject({ success: false, message: '手机号格式不正确' })
  }

  // 从本地缓存获取预约记录（模拟从服务器获取）
  // 在实际应用中，这应该是从服务器获取
  try {
    const reservations = wx.getStorageSync('reservations') || []

    return mockApiCall(
      {
        success: true,
        reservations
      },
      '获取预约记录失败',
      0.1
    )
  } catch (error) {
    console.error('获取本地预约记录异常:', error)
    return Promise.reject({ success: false, message: '获取预约记录失败' })
  }
}

/**
 * 取消预约
 * @param {string} phone 手机号
 * @param {string} date 预约日期
 * @param {number} spotId 车位ID
 * @returns {Promise} 取消结果
 */
const cancelReservation = (phone, date, spotId) => {
  console.log('调用取消预约API:', { phone, date, spotId })

  if (!phone || !date || !spotId) {
    return Promise.reject({ success: false, message: '取消预约参数不完整' })
  }

  return mockApiCall(
    {
      success: true,
      message: '取消成功'
    },
    '取消预约失败，请稍后再试',
    0.1
  )
}

/**
 * 获取系统配置
 * @returns {Promise} 系统配置
 */
const getSystemConfig = () => {
  console.log('调用获取配置API')

  return mockApiCall(
    {
      success: true,
      config: {
        totalParkingSpots: 80,
        yearlyQuota: 80,
        quarterlyQuota: 20,
        workdayDiscount: {
          monday: 0.5,
          tuesday: 1,
          wednesday: 1,
          thursday: 1,
          friday: 0.5
        }
      }
    },
    '获取系统配置失败',
    0.05
  )
}

/**
 * 通过微信code获取手机号
 * @param {string} code 微信临时凭证
 * @returns {Promise} 手机号获取结果
 */
const getPhoneNumberByCode = (code) => {
  console.log('调用获取手机号API:', { code })

  // 实际应用中，这里应该将code发送到服务器换取手机号
  return mockApiCall(
    {
      success: true,
      phoneNumber: '13912345678'
    },
    '获取手机号失败，请稍后再试',
    0.1
  )
}

module.exports = {
  login,
  getParkingAvailability,
  submitReservation,
  getUserReservations,
  cancelReservation,
  getSystemConfig,
  getPhoneNumberByCode
}
